package com.niit.session12;

public class TestAnimal {
	public static void main(String[] args) {
//		多态的前提2：父类的引用指向子类的对象
		Animal a = new Cat();
//		通过父类的引用去调用变量：编译看左边，执行也看左边
		System.out.println(a.name);
//		通过父类的引用去调用方法：编译看左边，执行看右边
		a.yelling();
//		向上转换
		Animal dog = new Dog();
		dog.yelling();
//		多态的弊端：无法调用子类独有的方法
//		dog.wachHouse();
		int i = 1000000;
//		类型的强制转换(向下类中转换是有风险的)
		byte  j = (byte) i;
//		
		Dog dog2 = new Dog();
//		如果要调用子类独有的方法，需要使用类型强制转换，把父类转换成子类，当然这个转换有风险
//		可以在转换之前先判断变量是否是你想要的类型，使用instanceof关键字
		if(dog instanceof Dog) {
			dog2 = (Dog) dog;
			dog2.watchHouse();
		}else {
			System.out.println("变量里不是Dog,无法调用Dog的方法");
		}
		
	}
}
class Dog extends Animal{
	String name ="旺财";
	@Override
	public void yelling() {
		System.out.println("汪汪~");
	}
//	独有方法
	public void watchHouse() {
		System.out.println("狗看家");
	}
}

class Animal{
	String name = "动物";
	public void yelling() {
		System.out.println("动物发出了不可描述声音~");
	}
}

//多态的前提1：存在继承或实现关系
class Cat extends Animal{
	String name ="小花";
	//多态的前提3:存在方法的重写
	@Override
	public void yelling() {
		System.out.println("喵~");
	}
}



